import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.Collection;
import java.util.Iterator;
import java.util.Calendar;
/**
 * Stelt een band voor die een bepaalde playlist gaat voorbrengen tijdens hun opkomen op het festival
 * 
 * @author Eric de Potter 
 * @version 1.0
 */
public class Band extends Optreden
{
    private final String genre = "Band";
    private Map<String, Integer> playlist;

    /**
     * Maakt een Band-boject aan zonder beschrijving
     */
    public Band(String artist, String startTime, Map<String, Integer> playlist, String stage)
    {
        super(App.convertToDate(startTime),"", stage, artist);
        this.playlist = playlist; 
    }
    
    /**
     * Maakt een Band-object met beschrijving
     */
    public Band(String artist, String startTime, Map<String, Integer> playlist, String stage, String description)
    {
        super(App.convertToDate(startTime),description, stage, artist);
        this.playlist = playlist; 
    }
    
    /**
     * @return  het genre
     */
    public String getGenre()
    {
        return genre;
    }
    
    /**
     * @return   de stoptijd van het optreden.
     */
    public Date getStopDate()
    {
        return calculateStopDate(getStartDate(), playlist);
    }    

    /**
     * Berekent de stoptijd aan de hand van de starttijd en de playlist
     * 
     * @param  startDate   de starttijd van de band
     * @param  playList    de playlist
     * @return     de stoptijd van de band 
     */
    private Date calculateStopDate(Date startDate, Map<String, Integer> playlist)
    {
        Collection<Integer> values = playlist.values();
        Date stopDate = startDate;
        Calendar stopCal = Calendar.getInstance();
        stopCal.setTime(stopDate);
        Iterator<Integer> it = values.iterator();
        int sec = 0;
        while(it.hasNext()) {
            sec += it.next();
        }
        stopCal.add(Calendar.SECOND,sec);
        return stopCal.getTime();
    }
    
    /**
     * Zet een aantal seconden om in een string van de vorm "mm:ss"  
     * 
     * @param  seconds  het aantal seconden dat omgevomrd moet worden
     * @return   de string die overeenkomt met het aantal seconden ("mm:ss")
     */
    private String convertToString(int seconds)
    {
        String returnString = "";
        String secondString = "";
        int minutes = 0;
        while(seconds >= 60) {
            minutes++;
            seconds -= 60;
        }
        if (seconds < 10)
            secondString += "0" + seconds;
        else
            secondString += seconds;
        returnString += "" + minutes + ":" + secondString;
        return returnString;
    }
    
    /**
     * Berekent de lengte aan de hand van de playlist
     * 
     * @return   de lengte van de playlist als een array van de string
     */
    private String[] getLength()
    {
        Collection<Integer> values = playlist.values();
        int sec = 0;
        int minutes = 0;
        int hours = 0;
        String returnString = "";
        Iterator<Integer> it = values.iterator();
        while(it.hasNext()) {
            sec += it.next();
        }
        while(sec >= 60) {
            minutes ++;
            sec -= 60;
        }
        while(minutes >=60) {
            hours++;
            minutes -= 60;
        }
        if (hours == 0) {
            returnString += "" + minutes + ":" + sec;
            return returnString.split(":");
        }
        returnString += "" + hours + ":" + minutes + ":" + sec;
        return returnString.split(":");
    }
    
    /**
     * @return de playlist als String
     */
    private String getPlaylist()
    {
        String returnString = "";
        Set<String> keys = playlist.keySet();
        for(String key: keys) {
            returnString += key + ": " + convertToString(playlist.get(key)) + "\n               ";
        }
        return returnString;
    }
    
    /**
     * @return een volledige beschrijving van de band
     */
    public String toString()
    {
        String[] time = getLength();
        Date starttijd = getStartDate();
        Date stoptijd = getStopDate();
        String returnString = genre + ": " + getTitle() + "\n";
           returnString += "Stage: " + getStage() + "\n";
           returnString += "Tijd: " + toDouble(starttijd.getHours()) + "u" + toDouble(starttijd.getMinutes());
           returnString += " - " + toDouble(stoptijd.getHours()) + "u" + toDouble(stoptijd.getMinutes()) + "\n";
        if (time.length == 3) {
            returnString += "Duur: " + time[0] + " uur " + time[1] + " min " + time[2] + " sec " + "\n";
        }
        else
            returnString += "Duur: " + time[0] + " min " + time[1] + " sec" + "\n";
           returnString += "Playlist: " + getPlaylist() + "\n";
        if (getDescription().trim().length() == 0)
            returnString += "Geen beschrijving" + "\n";
        else
            returnString += getDescription() + "\n";
        return returnString;
    }
}
